package com.tools.common.object;

import com.tools.common.container.RowKit;
import com.tools.common.object.string.StrKit;

import java.util.Arrays;

/**
 * 用于在线程执行任务类、
 * 自定义增强逻辑类、
 * 请求回调类等等操作类的
 * 内部新增并使用一些自定义的参数
 * */
@Note("用于在线程执行任务类、自定义增强逻辑类、请求回调类等等操作类的" +
        "内部新增并使用一些自定义的参数")
public abstract class CustomHandler {

    @Note("自定义的参数")
    private Object[] parameters;

    /* *******************************************************************************************
     *
     *           构造器
     *
     * *******************************************************************************************
     * */

    protected CustomHandler() {}

    protected CustomHandler(Object parameter) {
        if(parameter == null) return;
        this.parameters = new Object[] {parameter};
    }

    protected CustomHandler(Object... parameters) {
        this.parameters = parameters;
    }


    protected CustomHandler(Iterable<?> params) {
        if(params == null) return;
        int size = RowKit.getIterableSize(params);
        if(size == 0) return;
        int index = 0;
        this.parameters = new Object[size];
        for (Object param : params) {
            if(index == size) return;
            this.parameters[index] = param;
            index++;
        }
    }


    /* *******************************************************************************************
     *
     *           其他方法
     *
     * *******************************************************************************************
     * */

    public final Object getParam(int index) {
        if(parameters == null || parameters.length == 0) return null;
        if(index < 0 || index >= parameters.length) return null;
        return parameters[index];
    }

    public final  <T>T getParam(int index, Class<T> parameterType) {
        return (T) getParam(index);
    }

    public final <T>T getParam(int index, C<T> parameterType) {
        Object parameter = getParam(index);
        return (T) ObjKit.toRealValue(parameter, parameterType);
    }

    public final int getParamSize() {
        return (parameters == null) ? 0 : parameters.length;
    }

    @Override
    public String toString() {
        return StrKit.toString(parameters);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        CustomHandler that = (CustomHandler) o;
        return Arrays.equals(parameters, that.parameters);
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(parameters);
    }
}
